<!DOCTYPE html>
            
<HTML>
<HEAD>
<meta name="booktitle" content="Developing Applications With Objective Caml" >
 <meta charset="ISO-8859-1"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<META name="GENERATOR" content="hevea 1.05-7 of 2000-02-24">
<META NAME="Author" CONTENT="Christian.Queinnec@lip6.fr">
<LINK rel=stylesheet type="text/css" href="videoc-ocda.css">
<script language="JavaScript" src="videoc.js"><!--
//--></script>
<TITLE>
 Exercises
</TITLE>
</HEAD>
<BODY class="regularBody">
<A HREF="book-ora146.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora148.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
<HR>

<H2> Exercises</H2><A NAME="toc217"></A>
<H3> Stacks as Objects</H3>
Let us reconsider the stacks example, this time in object oriented style.
<OL type=1>
<LI>
 Define a class <TT><A id="a263__1_APPEND/POOcor.ml.tex" href="javascript: void showMessage('1_APPEND/POOcor.ml.tex')" class="mousable"><SPAN style=""><!-- 1,APPEND/POOcor.ml.tex,intstack -->intstack</SPAN></A></TT> using Objective CAML's lists, 
 implementing methods <TT>push</TT>, <TT>pop</TT>, <TT>top</TT> and
 <TT>size</TT>.
<!-- POPUP DEFINITION -->
<layer id="l__1_APPEND/POOcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","1_APPEND/POOcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>exception</B><CODE> </CODE>EmptyStack<CODE> </CODE><BR><CODE> </CODE><BR><CODE> </CODE><B>class</B><CODE> </CODE>intstack<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE><TT>(</TT>[]<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int<CODE> </CODE>list<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>emstack<CODE> </CODE>i<CODE> </CODE><CODE>=</CODE><CODE> </CODE>p<CODE> </CODE><CODE>:=</CODE><CODE> </CODE>i::<CODE> </CODE><CODE>!</CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>push<CODE> </CODE>i<CODE> </CODE><CODE>=</CODE><CODE> </CODE>p<CODE> </CODE><CODE>:=</CODE><CODE> </CODE>i<CODE> </CODE>::<CODE> </CODE><CODE>!</CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>pop<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>if</B><CODE> </CODE><CODE>!</CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE>[]<CODE> </CODE><B>then</B><CODE> </CODE>raise<CODE> </CODE>EmptyStack<CODE> </CODE><B>else</B><CODE> </CODE>p<CODE> </CODE><CODE>:=</CODE><CODE> </CODE>List.tl<CODE> </CODE><CODE>!</CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>top<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>if</B><CODE> </CODE><CODE>!</CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE>[]<CODE> </CODE><B>then</B><CODE> </CODE>raise<CODE> </CODE>EmptyStack<CODE> </CODE><B>else</B><CODE> </CODE>List.hd<CODE> </CODE><CODE>!</CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>size<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE>List.length<CODE> </CODE><CODE>!</CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>exception EmptyStack</CODE><BR><CODE>class intstack :</CODE><BR><CODE>  unit -&gt;</CODE><BR><CODE>  object</CODE><BR><CODE>    val p : int list ref</CODE><BR><CODE>    method emstack : int -&gt; unit</CODE><BR><CODE>    method pop : unit -&gt; unit</CODE><BR><CODE>    method push : int -&gt; unit</CODE><BR><CODE>    method size : unit -&gt; int</CODE><BR><CODE>    method top : unit -&gt; int</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("1_APPEND/POOcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Create an <A id="a264__2_APPEND/POOcor.ml.tex" href="javascript: void showMessage('2_APPEND/POOcor.ml.tex')" class="mousable"><SPAN style=""><!-- 2,APPEND/POOcor.ml.tex,instance -->instance</SPAN></A> containing 3 and 4 as stack elements. 
<!-- POPUP DEFINITION -->
<layer id="l__2_APPEND/POOcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","2_APPEND/POOcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>new</B><CODE> </CODE>intstack<CODE> </CODE>()<CODE> </CODE>;;<BR><CODE>val p : intstack = &lt;obj&gt;</CODE><BR># p#push<CODE> </CODE><CODE>3</CODE><CODE> </CODE>;;<BR><CODE>- : unit = ()</CODE><BR># p#push<CODE> </CODE><CODE>4</CODE><CODE> </CODE>;;<BR><CODE>- : unit = ()</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("2_APPEND/POOcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Define a new class <TT><A id="a265__3_APPEND/POOcor.ml.tex" href="javascript: void showMessage('3_APPEND/POOcor.ml.tex')" class="mousable"><SPAN style=""><!-- 3,APPEND/POOcor.ml.tex,newclassstack -->stack</SPAN></A></TT> containing elements 
 answering the method<BR><CODE>print : unit -&gt; unit</CODE>.
<!-- POPUP DEFINITION -->
<layer id="l__3_APPEND/POOcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","3_APPEND/POOcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>class</B><CODE> </CODE>stack<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE><TT>(</TT>[]<CODE> </CODE><CODE>:</CODE><CODE> </CODE><CODE>&lt;</CODE>print<CODE> </CODE><CODE>:</CODE><CODE> </CODE>unit<CODE> </CODE>-&gt;<CODE> </CODE>unit<CODE>&gt;</CODE><CODE> </CODE><CODE> </CODE>list<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>push<CODE> </CODE>i<CODE> </CODE><CODE>=</CODE><CODE> </CODE>p<CODE> </CODE><CODE>:=</CODE><CODE> </CODE>i::<CODE> </CODE><CODE>!</CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>pop<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>if</B><CODE> </CODE><CODE>!</CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE>[]<CODE> </CODE><B>then</B><CODE> </CODE>raise<CODE> </CODE>EmptyStack<CODE> </CODE><B>else</B><CODE> </CODE>p<CODE> </CODE><CODE>:=</CODE><CODE> </CODE>List.tl<CODE> </CODE><CODE>!</CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>top<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>if</B><CODE> </CODE><CODE>!</CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE>[]<CODE> </CODE><B>then</B><CODE> </CODE>raise<CODE> </CODE>EmptyStack<CODE> </CODE><B>else</B><CODE> </CODE>List.hd<CODE> </CODE><CODE>!</CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>size<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE>List.length<CODE> </CODE><CODE>!</CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class stack :</CODE><BR><CODE>  unit -&gt;</CODE><BR><CODE>  object</CODE><BR><CODE>    val p : &lt; print : unit -&gt; unit &gt; list ref</CODE><BR><CODE>    method pop : unit -&gt; unit</CODE><BR><CODE>    method push : &lt; print : unit -&gt; unit &gt; -&gt; unit</CODE><BR><CODE>    method size : unit -&gt; int</CODE><BR><CODE>    method top : unit -&gt; &lt; print : unit -&gt; unit &gt;</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("3_APPEND/POOcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Define a parameterized class <TT>['a] <A id="a266__4_APPEND/POOcor.ml.tex" href="javascript: void showMessage('4_APPEND/POOcor.ml.tex')" class="mousable"><SPAN style=""><!-- 4,APPEND/POOcor.ml.tex,classalphastack -->stack</SPAN></A></TT>, 
using the same methods.
<!-- POPUP DEFINITION -->
<layer id="l__4_APPEND/POOcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","4_APPEND/POOcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>class</B><CODE> </CODE><CODE>[</CODE><I>'a</I><CODE>]</CODE><CODE> </CODE>pstack<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE><TT>(</TT>[]<CODE> </CODE><CODE>:</CODE><CODE> </CODE><I>'a</I><CODE> </CODE><CODE> </CODE>list<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>push<CODE> </CODE>i<CODE> </CODE><CODE>=</CODE><CODE> </CODE>p<CODE> </CODE><CODE>:=</CODE><CODE> </CODE>i::<CODE> </CODE><CODE>!</CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>pop<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>if</B><CODE> </CODE><CODE>!</CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE>[]<CODE> </CODE><B>then</B><CODE> </CODE>raise<CODE> </CODE>EmptyStack<CODE> </CODE><B>else</B><CODE> </CODE>p<CODE> </CODE><CODE>:=</CODE><CODE> </CODE>List.tl<CODE> </CODE><CODE>!</CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>top<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>if</B><CODE> </CODE><CODE>!</CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE>[]<CODE> </CODE><B>then</B><CODE> </CODE>raise<CODE> </CODE>EmptyStack<CODE> </CODE><B>else</B><CODE> </CODE><TT>(</TT>List.hd<CODE> </CODE><CODE>!</CODE>p<TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>size<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE>List.length<CODE> </CODE><CODE>!</CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class ['a] pstack :</CODE><BR><CODE>  unit -&gt;</CODE><BR><CODE>  object</CODE><BR><CODE>    val p : 'a list ref</CODE><BR><CODE>    method pop : unit -&gt; unit</CODE><BR><CODE>    method push : 'a -&gt; unit</CODE><BR><CODE>    method size : unit -&gt; int</CODE><BR><CODE>    method top : unit -&gt; 'a</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("4_APPEND/POOcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Compare the different classes of stacks.
</OL><A NAME="toc218"></A>
<H3> Delayed Binding</H3>
This exercise illustrates how delayed binding can be used in a setting
other than subtyping.<BR>
<BR>
Given the program below:
<OL type=1>
<LI>
 Draw the relations between classes.<BR>
<BR>

<LI> Draw the different messages.<BR>
<BR>

<LI> Assuming you are in character mode without echo, what does the program display?
</OL>

<PRE><BR><B>exception</B><CODE> </CODE>CrLf;;<BR><B>class</B><CODE> </CODE>chain_read<CODE> </CODE><TT>(</TT>m<TT>)</TT><CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><B>object</B><CODE> </CODE><TT>(</TT>self<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>msg<CODE> </CODE><CODE>=</CODE><CODE> </CODE>m<BR><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>res<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>""</CODE><BR><BR><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>char_read<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>c<CODE> </CODE><CODE>=</CODE><CODE> </CODE>input_char<CODE> </CODE>stdin<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE><TT>(</TT>c<CODE> </CODE><CODE>!=</CODE><CODE> </CODE><CODE>'\n'</CODE><TT>)</TT><CODE> </CODE><B>then</B><CODE> </CODE><B>begin</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>output_char<CODE> </CODE>stdout<CODE> </CODE>c;<CODE> </CODE>flush<CODE> </CODE>stdout<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>String.make<CODE> </CODE><CODE>1</CODE><CODE> </CODE>c<BR><BR><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE><CODE> </CODE><B>private</B><CODE> </CODE>chain_read_aux<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><B>true</B><CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE>self#char_read<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>"\n"</CODE><CODE> </CODE><B>then</B><CODE> </CODE>raise<CODE> </CODE>CrLf<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE>res<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>res<CODE> </CODE><CODE>^</CODE><CODE> </CODE>s;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><BR><BR><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE><B>private</B><CODE> </CODE>chain_read_aux2<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE>self#lire_char<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>"\n"</CODE><CODE> </CODE><B>then</B><CODE> </CODE>raise<CODE> </CODE>CrLf<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE><B>begin</B><CODE> </CODE>res<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>res<CODE> </CODE><CODE>^</CODE><CODE> </CODE>s;<CODE> </CODE>self#chain_read_aux2<CODE> </CODE><B>end</B><BR><BR><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>chain_read<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>try</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>self#chain_read_aux<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE>End_of_file<CODE> </CODE><CODE> </CODE>-&gt;<CODE> </CODE>()<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>CrLf<CODE> </CODE>-&gt;<CODE> </CODE>()<BR><BR><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>input<CODE> </CODE><CODE>=</CODE><CODE> </CODE>res<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE><CODE>""</CODE>;<CODE> </CODE>print_string<CODE> </CODE>msg;<CODE> </CODE>flush<CODE> </CODE>stdout;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>self#chain_read<BR><BR><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>get<CODE> </CODE><CODE>=</CODE><CODE> </CODE>res<BR><B>end</B>;;<BR><BR><B>class</B><CODE> </CODE>mdp_read<CODE> </CODE><TT>(</TT>m<TT>)</TT><CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><B>object</B><CODE> </CODE><TT>(</TT>self<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><B>inherit</B><CODE> </CODE>chain_read<CODE> </CODE>m<BR><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>char_read<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>let</B><CODE> </CODE>c<CODE> </CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE>input_char<CODE> </CODE>stdin<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE><TT>(</TT>c<CODE> </CODE><CODE>!=</CODE><CODE> </CODE><CODE>'\n'</CODE><TT>)</TT><CODE> </CODE><B>then</B><CODE> </CODE><B>begin</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>output_char<CODE> </CODE>stdout<CODE> </CODE><CODE>'*'</CODE>;<CODE> </CODE>flush<CODE> </CODE>stdout<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B>;<BR><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>" "</CODE><CODE> </CODE><B>in</B><CODE> </CODE>s<CODE>.[</CODE><CODE>0</CODE><CODE>]</CODE><CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>c;<CODE> </CODE>s<BR><B>end</B>;;<BR><BR><B>let</B><CODE> </CODE>login<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>new</B><CODE> </CODE>chain_read<TT>(</TT><CODE>"Login : "</CODE><TT>)</TT>;;<BR><B>let</B><CODE> </CODE>passwd<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>new</B><CODE> </CODE>mdp_read<TT>(</TT><CODE>"Passwd : "</CODE><TT>)</TT>;;<BR>login#input;;<BR>passwd#input;;<BR>print_string<CODE> </CODE><TT>(</TT>login#get<TT>)</TT>;;print_newline();;<BR>print_string<CODE> </CODE><TT>(</TT>passwd#get<TT>)</TT>;;print_newline();;<BR>

</PRE>
<BR>
<BR>
<A NAME="toc219"></A>
<H3> Abstract Classes and an Expression Evaluator</H3>This exercise illustrates code factorization with abstract classes.<BR>
<BR>
All constructed arithmetic expressions are instances of a subclass of
the abstract class <I>expr_ar</I>.
<OL type=1>
<LI>
 Define an abstract class <I><A id="a267__5_APPEND/POOcor.ml.tex" href="javascript: void showMessage('5_APPEND/POOcor.ml.tex')" class="mousable"><SPAN style=""><!-- 5,APPEND/POOcor.ml.tex,exprar -->expr_ar</SPAN></A></I> for 
 arithmetic expressions with two abstract methods: <TT>eval</TT> of type
 <I>float</I>, and <TT>print</TT> of type <I>unit</I>, which respectively
 evaluates and displays an arithmetic expression.
<!-- POPUP DEFINITION -->
<layer id="l__5_APPEND/POOcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","5_APPEND/POOcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>class</B><CODE> </CODE><B>virtual</B><CODE> </CODE>expr_ar<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE><B>virtual</B><CODE> </CODE>eval<CODE> </CODE><CODE>:</CODE><CODE> </CODE>unit<CODE> </CODE>-&gt;<CODE> </CODE>float<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE><B>virtual</B><CODE> </CODE>print<CODE> </CODE><CODE>:</CODE><CODE> </CODE>unit<CODE> </CODE>-&gt;<CODE> </CODE>unit<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class virtual expr_ar :</CODE><BR><CODE>  unit -&gt;</CODE><BR><CODE>  object</CODE><BR><CODE>    method virtual eval : unit -&gt; float</CODE><BR><CODE>    method virtual print : unit -&gt; unit</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("5_APPEND/POOcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Define a concrete class <I><A id="a268__6_APPEND/POOcor.ml.tex" href="javascript: void showMessage('6_APPEND/POOcor.ml.tex')" class="mousable"><SPAN style=""><!-- 6,APPEND/POOcor.ml.tex,constant -->constant</SPAN></A></I>, a subclass 
 of <I>expr_ar</I>.
<!-- POPUP DEFINITION -->
<layer id="l__6_APPEND/POOcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","6_APPEND/POOcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>class</B><CODE> </CODE>constant<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>inherit</B><CODE> </CODE>expr_ar<CODE> </CODE>()<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>c<CODE> </CODE><CODE>=</CODE><CODE> </CODE>x<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>eval<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE>c<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>print<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE>print_float<CODE> </CODE>c<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class constant :</CODE><BR><CODE>  float -&gt;</CODE><BR><CODE>  object</CODE><BR><CODE>    val c : float</CODE><BR><CODE>    method eval : unit -&gt; float</CODE><BR><CODE>    method print : unit -&gt; unit</CODE><BR><CODE>  end</CODE><BR><BR><CODE>(* autre solution : *)</CODE><BR><BR># <B>class</B><CODE> </CODE>const<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>inherit</B><CODE> </CODE>expr_ar<CODE> </CODE>()<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>eval<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE>x<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>print<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE>print_float<CODE> </CODE>x<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class const :</CODE><BR><CODE>  float -&gt; object method eval : unit -&gt; float method print : unit -&gt; unit end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("6_APPEND/POOcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Define an abstract subclass <I><A id="a269__7_APPEND/POOcor.ml.tex" href="javascript: void showMessage('7_APPEND/POOcor.ml.tex')" class="mousable"><SPAN style=""><!-- 7,APPEND/POOcor.ml.tex,binop -->bin_op</SPAN></A></I> of 
 <I>expr_ar</I> implementing methods <TT>eval</TT> and <TT>print</TT>
 using two new abstract methods <TT>oper</TT>,
 of type <I>(float * float) -&gt; float</I> (used by <TT>eval</TT>) and
 <TT>symbol</TT> of type <I>string</I>
 (used by <TT>print</TT>).
<!-- POPUP DEFINITION -->
<layer id="l__7_APPEND/POOcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","7_APPEND/POOcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>class</B><CODE> </CODE><B>virtual</B><CODE> </CODE>bin_op<CODE> </CODE>g<CODE> </CODE>d<CODE> </CODE><CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><CODE> </CODE><TT>(</TT>this<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>inherit</B><CODE> </CODE>expr_ar<CODE> </CODE>()<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>fg<CODE> </CODE><CODE>=</CODE><CODE> </CODE>g<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>fd<CODE> </CODE><CODE>=</CODE><CODE> </CODE>d<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE><B>virtual</B><CODE> </CODE>symbol<CODE> </CODE><CODE>:</CODE><CODE> </CODE>string<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE><B>virtual</B><CODE> </CODE>oper<CODE> </CODE><CODE>:</CODE><CODE> </CODE>float<CODE> </CODE><CODE>*</CODE><CODE> </CODE>float<CODE> </CODE>-&gt;<CODE> </CODE>float<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>eval<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE>fg#eval()<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>and</B><CODE> </CODE>y<CODE> </CODE><CODE>=</CODE><CODE> </CODE>fd#eval()<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>this#oper<TT>(</TT>x<CODE>,</CODE>y<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>print<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>fg#print<CODE> </CODE>()<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>print_string<CODE> </CODE><TT>(</TT>this#symbol<TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>fd#print<CODE> </CODE>()<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class virtual bin_op :</CODE><BR><CODE>  (&lt; eval : unit -&gt; float; print : unit -&gt; 'b; .. &gt; as 'a) -&gt;</CODE><BR><CODE>  (&lt; eval : unit -&gt; float; print : unit -&gt; unit; .. &gt; as 'c) -&gt;</CODE><BR><CODE>  object</CODE><BR><CODE>    val fd : 'c</CODE><BR><CODE>    val fg : 'a</CODE><BR><CODE>    method eval : unit -&gt; float</CODE><BR><CODE>    method virtual oper : float * float -&gt; float</CODE><BR><CODE>    method print : unit -&gt; unit</CODE><BR><CODE>    method virtual symbol : string</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("7_APPEND/POOcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Define concrete classes <I><A id="a270__8_APPEND/POOcor.ml.tex" href="javascript: void showMessage('8_APPEND/POOcor.ml.tex')" class="mousable"><SPAN style=""><!-- 8,APPEND/POOcor.ml.tex,add -->add</SPAN></A></I> and <I>mul</I> as 
 subclasses of <I>bin_op</I> that implement the methods <TT>oper</TT> and
 <TT>symbol</TT>.
<!-- POPUP DEFINITION -->
<layer id="l__8_APPEND/POOcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","8_APPEND/POOcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>class</B><CODE> </CODE>add<CODE> </CODE>x<CODE> </CODE>y<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>inherit</B><CODE> </CODE>bin_op<CODE> </CODE>x<CODE> </CODE>y<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>symbol<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>"+"</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>oper<TT>(</TT>x<CODE>,</CODE>y<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE>x<CODE> </CODE><CODE>+.</CODE><CODE> </CODE>y<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class add :</CODE><BR><CODE>  (&lt; eval : unit -&gt; float; print : unit -&gt; 'b; .. &gt; as 'a) -&gt;</CODE><BR><CODE>  (&lt; eval : unit -&gt; float; print : unit -&gt; unit; .. &gt; as 'c) -&gt;</CODE><BR><CODE>  object</CODE><BR><CODE>    val fd : 'c</CODE><BR><CODE>    val fg : 'a</CODE><BR><CODE>    method eval : unit -&gt; float</CODE><BR><CODE>    method oper : float * float -&gt; float</CODE><BR><CODE>    method print : unit -&gt; unit</CODE><BR><CODE>    method symbol : string</CODE><BR><CODE>  end</CODE><BR><BR># <B>class</B><CODE> </CODE>mul<CODE> </CODE>x<CODE> </CODE>y<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>inherit</B><CODE> </CODE>bin_op<CODE> </CODE>x<CODE> </CODE>y<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>symbol<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>"*"</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>oper<TT>(</TT>x<CODE>,</CODE>y<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE>x<CODE> </CODE><CODE>*.</CODE><CODE> </CODE>y<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class mul :</CODE><BR><CODE>  (&lt; eval : unit -&gt; float; print : unit -&gt; 'b; .. &gt; as 'a) -&gt;</CODE><BR><CODE>  (&lt; eval : unit -&gt; float; print : unit -&gt; unit; .. &gt; as 'c) -&gt;</CODE><BR><CODE>  object</CODE><BR><CODE>    val fd : 'c</CODE><BR><CODE>    val fg : 'a</CODE><BR><CODE>    method eval : unit -&gt; float</CODE><BR><CODE>    method oper : float * float -&gt; float</CODE><BR><CODE>    method print : unit -&gt; unit</CODE><BR><CODE>    method symbol : string</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("8_APPEND/POOcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Draw the inheritance tree.<BR>
<BR>

<LI> Write a <A id="a271__9_APPEND/POOcor.ml.tex" href="javascript: void showMessage('9_APPEND/POOcor.ml.tex')" class="mousable"><SPAN style=""><!-- 9,APPEND/POOcor.ml.tex,testgenclass -->function</SPAN></A> that takes a sequence of 
 <TT>Genlex.token</TT>, and constructs an object of type <I>expr_ar</I>. 
<!-- POPUP DEFINITION -->
<layer id="l__9_APPEND/POOcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","9_APPEND/POOcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>open</B><CODE> </CODE>Genlex<CODE> </CODE>;;<BR># <B>exception</B><CODE> </CODE>Found<CODE> </CODE><B>of</B><CODE> </CODE>expr_ar<CODE> </CODE>;;<BR><CODE>exception Found of expr_ar</CODE><BR><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>create<CODE> </CODE>accu<CODE> </CODE>l<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>r<CODE> </CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>match</B><CODE> </CODE>Stream.next<CODE> </CODE>l<CODE> </CODE><B>with</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Float<CODE> </CODE>f<CODE> </CODE>-&gt;<CODE> </CODE><B>new</B><CODE> </CODE>constant<CODE> </CODE>f<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Int<CODE> </CODE>i<CODE> </CODE>-&gt;<CODE> </CODE><TT>(</TT><CODE> </CODE><B>new</B><CODE> </CODE>constant<CODE> </CODE><TT>(</TT>float<CODE> </CODE>i<TT>)</TT><CODE> </CODE><CODE>:&gt;</CODE><CODE> </CODE>expr_ar<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Kwd<CODE> </CODE>k<CODE> </CODE><CODE> </CODE>-&gt;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>v1<CODE> </CODE><CODE>=</CODE><CODE> </CODE>accu#top()<CODE> </CODE><B>in</B><CODE> </CODE>accu#pop();<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>v2<CODE> </CODE><CODE>=</CODE><CODE> </CODE>accu#top()<CODE> </CODE><B>in</B><CODE> </CODE>accu#pop();<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><TT>(</TT><CODE> </CODE><B>match</B><CODE> </CODE>k<CODE> </CODE><B>with</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>"+"</CODE><CODE> </CODE>-&gt;<CODE> </CODE><TT>(</TT><CODE> </CODE><B>new</B><CODE> </CODE>add<CODE> </CODE>v2<CODE> </CODE>v1<CODE> </CODE><CODE>:&gt;</CODE><CODE> </CODE>expr_ar<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>"*"</CODE><CODE> </CODE>-&gt;<CODE> </CODE><TT>(</TT><CODE> </CODE><CODE> </CODE><B>new</B><CODE> </CODE>mul<CODE> </CODE>v2<CODE> </CODE>v1<CODE> </CODE><CODE>:&gt;</CODE><CODE> </CODE>expr_ar<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>";"</CODE><CODE> </CODE>-&gt;<CODE> </CODE>raise<CODE> </CODE><TT>(</TT>Found<CODE> </CODE><TT>(</TT>accu#top()<TT>)</TT><TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE>-&gt;<CODE> </CODE>failwith<CODE> </CODE><CODE>"aux : bad keyword"</CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE>-&gt;<CODE> </CODE>failwith<CODE> </CODE><CODE>"aux : bad case"</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>create<CODE> </CODE><TT>(</TT>accu#push<CODE> </CODE><TT>(</TT>r<CODE> </CODE><CODE>:&gt;</CODE><CODE> </CODE>expr_ar<TT>)</TT>;<CODE> </CODE>accu<TT>)</TT><CODE> </CODE>l<CODE> </CODE>;;<BR><CODE>val create :</CODE><BR><CODE>  &lt; pop : unit -&gt; 'a; push : expr_ar -&gt; 'b; top : unit -&gt; expr_ar; .. &gt; -&gt;</CODE><BR><CODE>  Genlex.token Stream.t -&gt; 'c = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE>gl<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Genlex.make_lexer<CODE> </CODE><CODE>[</CODE><CODE>"+"</CODE>;<CODE> </CODE><CODE>"*"</CODE>;<CODE> </CODE><CODE>";"</CODE><CODE>]</CODE><CODE> </CODE>;;<BR><CODE>val gl : char Stream.t -&gt; Genlex.token Stream.t = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE>run<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Stream.of_channel<CODE> </CODE>stdin<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>create<CODE> </CODE><TT>(</TT><B>new</B><CODE> </CODE>pstack<CODE> </CODE>()<TT>)</TT><CODE> </CODE><TT>(</TT>gl<CODE> </CODE>s<TT>)</TT><CODE> </CODE>;;<BR><CODE>val run : unit -&gt; 'a = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("9_APPEND/POOcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Test this program by reading the standard input using the generic
 lexical analyzer <TT>Genlex</TT>. You can enter the expressions in post-fix
 form.
</OL><A NAME="toc220"></A>
<H3> The Game of Life and Objects.</H3>
Define the following two classes:
<UL>
<LI>
 <CODE>cell</CODE>&nbsp;: for the cells of the world, with the method
 <TT>isAlive : unit -&gt; bool</TT>

<LI> <CODE>world</CODE>&nbsp;: with an array of <CODE>cell</CODE>, and the messages:
<PRE>
display : unit -&gt; unit
nextGen : unit -&gt; unit
setCell : int * int -&gt; cell -&gt; unit
getCell : int * int -&gt; cell
</PRE></UL><OL type=1>
<LI>
 Write the class <TT><A id="a272__10_APPEND/POOcor.ml.tex" href="javascript: void showMessage('10_APPEND/POOcor.ml.tex')" class="mousable"><SPAN style=""><!-- 10,APPEND/POOcor.ml.tex,cell -->cell</SPAN></A></TT>. 
<!-- POPUP DEFINITION -->
<layer id="l__10_APPEND/POOcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","10_APPEND/POOcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>class</B><CODE> </CODE>cell<CODE> </CODE>a<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>v<CODE> </CODE><CODE>=</CODE><CODE> </CODE><TT>(</TT>a<CODE> </CODE><CODE>:</CODE><CODE> </CODE>bool<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>isAlive<CODE> </CODE><CODE>=</CODE><CODE> </CODE>v<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class cell : bool -&gt; object val mutable v : bool method isAlive : bool end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("10_APPEND/POOcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write an abstract class <TT><A id="a273__11_APPEND/POOcor.ml.tex" href="javascript: void showMessage('11_APPEND/POOcor.ml.tex')" class="mousable"><SPAN style=""><!-- 11,APPEND/POOcor.ml.tex,absworld -->absWorld</SPAN></A></TT> that implements 
 the abstract methods <CODE>display</CODE>, <CODE>getCell</CODE> and <CODE>setCell</CODE>.
 Leave the method <CODE>nextGen</CODE> abstract.
<!-- POPUP DEFINITION -->
<layer id="l__11_APPEND/POOcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","11_APPEND/POOcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>class</B><CODE> </CODE><B>virtual</B><CODE> </CODE>absWorld<CODE> </CODE>n<CODE> </CODE>m<CODE> </CODE><CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><TT>(</TT>self<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>tcell<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Array.create_matrix<CODE> </CODE>n<CODE> </CODE>m<CODE> </CODE><TT>(</TT><B>new</B><CODE> </CODE>cell<CODE> </CODE><B>false</B><TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>maxx<CODE> </CODE><CODE>=</CODE><CODE> </CODE>n<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>maxy<CODE> </CODE><CODE>=</CODE><CODE> </CODE>m<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>gen<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE><B>private</B><CODE> </CODE>draw<TT>(</TT>c<TT>)</TT><CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>c#isAlive<CODE> </CODE><B>then</B><CODE> </CODE>print_string<CODE> </CODE><CODE>"*"</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE>print_string<CODE> </CODE><CODE>"."</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>display()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>i<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE><CODE> </CODE><B>to</B><CODE> </CODE><TT>(</TT>maxx<CODE>-</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>j<CODE>=</CODE><CODE>0</CODE><CODE> </CODE><B>to</B><CODE> </CODE><TT>(</TT>maxy<CODE> </CODE><CODE>-</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>print_string<CODE> </CODE><CODE>" "</CODE><CODE> </CODE>;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>self#draw<TT>(</TT>tcell<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE>.</CODE><TT>(</TT>j<TT>)</TT><TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>print_newline()<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>getCell<TT>(</TT>i<CODE>,</CODE>j<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE>tcell<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE>.</CODE><TT>(</TT>j<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>setCell<TT>(</TT>i<CODE>,</CODE>j<CODE>,</CODE>c<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE>tcell<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE>.</CODE><TT>(</TT>j<TT>)</TT><CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>c<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>getCells<CODE> </CODE><CODE>=</CODE><CODE> </CODE>tcell<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class virtual absWorld :</CODE><BR><CODE>  int -&gt;</CODE><BR><CODE>  int -&gt;</CODE><BR><CODE>  object</CODE><BR><CODE>    val mutable gen : int</CODE><BR><CODE>    val maxx : int</CODE><BR><CODE>    val maxy : int</CODE><BR><CODE>    val mutable tcell : cell array array</CODE><BR><CODE>    method display : unit -&gt; unit</CODE><BR><CODE>    method private draw : cell -&gt; unit</CODE><BR><CODE>    method getCell : int * int -&gt; cell</CODE><BR><CODE>    method getCells : cell array array</CODE><BR><CODE>    method setCell : int * int * cell -&gt; unit</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("11_APPEND/POOcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write the class <TT><A id="a274__12_APPEND/POOcor.ml.tex" href="javascript: void showMessage('12_APPEND/POOcor.ml.tex')" class="mousable"><SPAN style=""><!-- 12,APPEND/POOcor.ml.tex,world -->world</SPAN></A></TT>, a subclass of <CODE>absWorld</CODE>, 
 that implements the method <CODE>nextGen</CODE> according to the growth rules.
<!-- POPUP DEFINITION -->
<layer id="l__12_APPEND/POOcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","12_APPEND/POOcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>class</B><CODE> </CODE>world<CODE> </CODE>n<CODE> </CODE>m<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><TT>(</TT>self<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>inherit</B><CODE> </CODE>absWorld<CODE> </CODE>n<CODE> </CODE>m<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>neighbors<TT>(</TT>x<CODE>,</CODE>y<TT>)</TT><CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>r<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE><CODE>0</CODE><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>i<CODE>=</CODE>x<CODE>-</CODE><CODE>1</CODE><CODE> </CODE><B>to</B><CODE> </CODE>x<CODE>+</CODE><CODE>1</CODE><CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>k<CODE> </CODE><CODE>=</CODE><CODE> </CODE><TT>(</TT>i<CODE>+</CODE>maxx<TT>)</TT><CODE> </CODE><B>mod</B><CODE> </CODE>maxx<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>j<CODE>=</CODE>y<CODE>-</CODE><CODE>1</CODE><CODE> </CODE><B>to</B><CODE> </CODE>y<CODE>+</CODE><CODE>1</CODE><CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>l<CODE> </CODE><CODE>=</CODE><CODE> </CODE><TT>(</TT>j<CODE> </CODE><CODE>+</CODE><CODE> </CODE>maxy<TT>)</TT><CODE> </CODE><B>mod</B><CODE> </CODE>maxy<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>tcell<CODE>.</CODE><TT>(</TT>k<TT>)</TT><CODE>.</CODE><TT>(</TT>l<TT>)</TT>#isAlive<CODE> </CODE><B>then</B><CODE> </CODE>incr<CODE> </CODE>r<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>tcell<CODE>.</CODE><TT>(</TT>x<TT>)</TT><CODE>.</CODE><TT>(</TT>y<TT>)</TT>#isAlive<CODE> </CODE><B>then</B><CODE> </CODE>decr<CODE> </CODE>r<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>!</CODE>r<BR><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>nextGen()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>w2<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>new</B><CODE> </CODE>world<CODE> </CODE>maxx<CODE> </CODE>maxy<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>i<CODE>=</CODE><CODE>0</CODE><CODE> </CODE><B>to</B><CODE> </CODE>maxx<CODE>-</CODE><CODE>1</CODE><CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>j<CODE>=</CODE><CODE>0</CODE><CODE> </CODE><B>to</B><CODE> </CODE>maxy<CODE> </CODE><CODE>-</CODE><CODE>1</CODE><CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE>self#neighbors<TT>(</TT>i<CODE>,</CODE>j<TT>)</TT><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>tcell<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE>.</CODE><TT>(</TT>j<TT>)</TT>#isAlive<CODE> </CODE><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>then</B><CODE> </CODE><TT>(</TT><B>if</B><CODE> </CODE><TT>(</TT>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>2</CODE><TT>)</TT><CODE> </CODE><CODE>||</CODE><CODE> </CODE><TT>(</TT>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>3</CODE><TT>)</TT><CODE> </CODE><B>then</B><CODE> </CODE>w2#setCell<TT>(</TT>i<CODE>,</CODE>j<CODE>,</CODE><B>new</B><CODE> </CODE>cell<CODE> </CODE><B>true</B><TT>)</TT><TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE><TT>(</TT><B>if</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>3</CODE><CODE> </CODE><B>then</B><CODE> </CODE>w2#setCell<TT>(</TT>i<CODE>,</CODE>j<CODE>,</CODE><B>new</B><CODE> </CODE>cell<CODE> </CODE><B>true</B><TT>)</TT><TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>tcell<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>w2#getCells<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>gen<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>gen<CODE> </CODE><CODE>+</CODE><CODE> </CODE><CODE>1</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class world :</CODE><BR><CODE>  int -&gt;</CODE><BR><CODE>  int -&gt;</CODE><BR><CODE>  object</CODE><BR><CODE>    val mutable gen : int</CODE><BR><CODE>    val maxx : int</CODE><BR><CODE>    val maxy : int</CODE><BR><CODE>    val mutable tcell : cell array array</CODE><BR><CODE>    method display : unit -&gt; unit</CODE><BR><CODE>    method private draw : cell -&gt; unit</CODE><BR><CODE>    method getCell : int * int -&gt; cell</CODE><BR><CODE>    method getCells : cell array array</CODE><BR><CODE>    method neighbors : int * int -&gt; int</CODE><BR><CODE>    method nextGen : unit -&gt; unit</CODE><BR><CODE>    method setCell : int * int * cell -&gt; unit</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("12_APPEND/POOcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write the <A id="a275__13_APPEND/POOcor.ml.tex" href="javascript: void showMessage('13_APPEND/POOcor.ml.tex')" class="mousable"><SPAN style=""><!-- 13,APPEND/POOcor.ml.tex,mainprog -->main program</SPAN></A> which creates an empty world, 
 adds some cells, and then enters an interactive loop that iterates displaying the world, waiting
 for an interaction and computing the next generation.
<!-- POPUP DEFINITION -->
<layer id="l__13_APPEND/POOcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","13_APPEND/POOcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>exception</B><CODE> </CODE>The_end;;<BR><CODE>exception The_end</CODE><BR><BR># <B>let</B><CODE> </CODE>main<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>a<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>1</CODE><CODE>0</CODE><CODE> </CODE><B>and</B><CODE> </CODE>b<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>1</CODE><CODE>2</CODE><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>w<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>new</B><CODE> </CODE>world<CODE> </CODE>a<CODE> </CODE>b<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>w#setCell<TT>(</TT><CODE>4</CODE><CODE>,</CODE><CODE>4</CODE><CODE>,</CODE><B>new</B><CODE> </CODE>cell<CODE> </CODE><B>true</B><TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>w#setCell<TT>(</TT><CODE>4</CODE><CODE>,</CODE><CODE>5</CODE><CODE>,</CODE><B>new</B><CODE> </CODE>cell<CODE> </CODE><B>true</B><TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>w#setCell<TT>(</TT><CODE>4</CODE><CODE>,</CODE><CODE>6</CODE><CODE>,</CODE><B>new</B><CODE> </CODE>cell<CODE> </CODE><B>true</B><TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><B>true</B><CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>w#display()<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE><TT>(</TT><TT>(</TT>read_line()<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>"F"</CODE><TT>)</TT><CODE> </CODE><B>then</B><CODE> </CODE>raise<CODE> </CODE>The_end<CODE> </CODE><B>else</B><CODE> </CODE>w#nextGen()<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE>The_end<CODE> </CODE>-&gt;<CODE> </CODE>()<CODE> </CODE>;;<BR><CODE>val main : unit -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("13_APPEND/POOcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL>
<HR>
<A HREF="book-ora146.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora148.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
</BODY>
</HTML>
